package demo8

// 观察者模式，订阅发布模式，一个主题对应多个观察者，观察者多的情况下会导致系统性能下降

import "fmt"

type Subjecter interface{
	// 注册

	// 反注册
	// 增加观察者
	Attach(Observer)
	// 自定义内容
	UpdateContext(string)
	GetContext() string
}
type Subject struct{
	context string
	observers []Observer
}
func NewSubject()*Subject{
	return &Subject{
		observers:make([]Observer, 0),
	}
}

func (s *Subject)Attach(o Observer){
	s.observers = append(s.observers,o)
}

func(s *Subject)notify(){
	for _,o := range s.observers{
		o.Update(s)
	}
}

func (s *Subject)UpdateContext(c string){
	s.context = c
	s.notify()
}

func (s *Subject)GetContext()string{
	return s.context
}

type Observer interface{
	Update(Subjecter)
}

type Observice struct{
	name string
}

func NewObservice(name string) *Observice{
	return &Observice{
		name:name,
	}
}

func(o *Observice)Update(s Subjecter){
	fmt.Println(o.name,s.GetContext())
}
// 下面还可以写其他的观察者，随着主题的变动而变动，但是不建议多个观察者